package pe.com.cotelasa.scp.dominio.servicio.impl;

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.inject.Inject;

import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.scp.dao.IDAOGuiaRemision;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.ESTADO_RESULTADO;
import pe.com.cotelasa.scp.dominio.common.ResultadoServicio;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioGuiaRemision;
import pe.com.cotelasa.scp.entidad.GuiaRemision;
import pe.com.cotelasa.scp.entidad.Proveedor;
import pe.com.cotelasa.scp.to.GuiaRemisionTO;

@SuppressWarnings("serial")
@Service
public class ServicioGuiaRemision implements IServicioGuiaRemision,
        Serializable {

    @Inject
    private IDAOGuiaRemision daoGuiaRemision;

    @Override
    public ResultadoServicio guardarGuiaRemision(GuiaRemision guiaRemision) {
        ResultadoServicio resultadoServicio = new ResultadoServicio(
                ESTADO_RESULTADO.EXITOSO);
        try {
            if (guiaRemision.getIdOrdenCompraServicio().getId() == null
                    || guiaRemision.getIdOrdenCompraServicio().getId() == 0) {
                guiaRemision.setIdOrdenCompraServicio(null);
            }
            if (guiaRemision.getOrdenPedido().getId() == null
                    || guiaRemision.getOrdenPedido().getId() == 0) {
                guiaRemision.setOrdenPedido(null);
            }
            daoGuiaRemision.insertar(guiaRemision);
            resultadoServicio.setMensaje("Se guardo la guia de remision satisfactoriamente.");
        } catch (Exception ex) {
            resultadoServicio.setEstadoResultado(ESTADO_RESULTADO.FALLIDO);
            resultadoServicio
                    .setMensaje("Ocurrio un problema al tratar de guardar la Guia de Remision. Vuelva a intentar");
            Logger.getLogger(ServicioGuiaRemision.class.getName()).log(
                    Level.SEVERE, null, ex);
        }
        return resultadoServicio;
    }

    @Override
    public List<GuiaRemisionTO> obtenerGuiaRemisionBusqueda(GuiaRemision guiaRemision, Date fechaInicio, Date fechaFinal) throws ServiceException {
        try {
            return daoGuiaRemision
                    .obtenerGuiaRemisionBusqueda(guiaRemision, fechaInicio, fechaFinal);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public GuiaRemision conseguirGuiaDeRemisionPorId(Integer idGuiaRemision)
            throws ServiceException {
        try {
            return daoGuiaRemision.obtenerEntidadPorId(GuiaRemision.class,
                    idGuiaRemision);
        } catch (DAOException ex) {
            ex.printStackTrace();
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public ResultadoServicio actualizarGuiaDeRemision(GuiaRemision guiaRemision)
            throws ServiceException {
        ResultadoServicio resultadoServicio = new ResultadoServicio(
                ESTADO_RESULTADO.EXITOSO);
        try {
            daoGuiaRemision.actualizar(guiaRemision);
            resultadoServicio.setMensaje("Se actualizo la guia de remision satisfactoriamente.");
        } catch (DAOException ex) {
            resultadoServicio.setEstadoResultado(ESTADO_RESULTADO.FALLIDO);
            resultadoServicio.setMensaje("Ocurrio un problema al tratar de actualizar la Guia de Remision. Vuelva a intentar");
            Logger.getLogger(ServicioGuiaRemision.class.getName()).log(
                    Level.SEVERE, null, ex);
        }
        return resultadoServicio;
    }

    @Override
    public List<GuiaRemision> obtenerGuiaRemisionPorOrdenCS(GuiaRemision guia) throws ServiceException {
        try {
            Map<String, Object> parametro = new HashMap<String, Object>();
            parametro.put("idOrdenCompraServicio", guia.getIdOrdenCompraServicio().getId());
            parametro.put("parametroTipoGuia", Constantes.TipoGuiaRemision.GUIA_ENTRADA);
            parametro.put("estadoGuia", "E");
            parametro.put("idFactura", null);
            parametro.put("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor());

            return (List<GuiaRemision>) daoGuiaRemision.obtenerColeccionEntidadPorFiltros(GuiaRemision.class, parametro);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public List<GuiaRemision> obtenerGuiaExportacionPorOP(GuiaRemision guia) throws ServiceException {
        try {
            Map<String, Object> parametro = new HashMap<String, Object>();
            parametro.put("ordenPedido", guia.getOrdenPedido().getId());
            parametro.put("idEmpresa", guia.getIdEmpresa().getId());
            parametro.put("parametroMotivoGuia", guia.getParametroMotivoGuia().getId());
            parametro.put("idVentaFacturacion", null);
            parametro.put("estadoGuia", "E");
            parametro.put("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor());

            return (List<GuiaRemision>) daoGuiaRemision.obtenerColeccionEntidadPorFiltros(GuiaRemision.class, parametro);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public GuiaRemision obtenerGuiaRemisionPorProveedor(String numGuia, GuiaRemision guia) throws ServiceException {
        try {

            Map<String, Object> parametro = new HashMap<String, Object>();
            String[] numero = StringUtils.split(numGuia, "-");
            parametro.put("idOrdenCompraServicio", guia.getIdOrdenCompraServicio().getId());
            parametro.put("estadoGuia", "E");
            parametro.put("numeroGuia", numero[1]);
            parametro.put("serie", numero[0]);
            parametro.put("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor());
            List<GuiaRemision> lista = (List<GuiaRemision>) daoGuiaRemision.obtenerColeccionEntidadPorFiltros(GuiaRemision.class, parametro);
            System.out.println("lista de guias: " + lista);
            if (lista.isEmpty()) {
                return null;
            } else {
                System.out.println("guia de remision: " + lista.get(0));
                return lista.get(0);
            }

        } catch (DAOException ex) {
            ex.printStackTrace();
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public List<GuiaRemision> listarGuiaRemisionPorFiltro(GuiaRemision guia) throws ServiceException {
        try {
            Map<String, Object> parametro = new HashMap<String, Object>();
            parametro.put("idOrdenCompraServicio", guia.getIdOrdenCompraServicio().getId());
            parametro.put("parametroTipoGuia", guia.getParametroTipoGuia().getId());
            parametro.put("estadoGuia", "E");
            parametro.put("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor());

            return (List<GuiaRemision>) daoGuiaRemision.obtenerColeccionEntidadPorFiltros(GuiaRemision.class, parametro);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public boolean esNumeroGuiaCorrecta(GuiaRemision guia) throws ServiceException {
        try {
            Map<String, Object> parametro = new HashMap<String, Object>();
            parametro.put("serie", guia.getSerie());
            parametro.put("numeroGuia", guia.getNumeroGuia());
            parametro.put("parametroTipoGuia", guia.getParametroTipoGuia().getId());
            parametro.put("estadoGuia", "" + GuiaRemision.ESTADO_GUIA_REMISION.EMITIDO.getValor());
            parametro.put("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor());

            if (daoGuiaRemision.obtenerColeccionEntidadPorFiltros(GuiaRemision.class, parametro).size() > 0) {
                return true;
            } else {
                return false;
            }

        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public Collection<GuiaRemision> obtenerGuiasPorSerie(GuiaRemision guia, Date fechaInicio, Date fechaFinal) throws ServiceException {
        try {
            return daoGuiaRemision.obtenerGuiasPorSerie(guia, fechaInicio, fechaFinal);

        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }
}
